第三方庫能讓別的專案使用的關鍵是能夠讓別人找到它的頭文件和庫文件。
而之前在 "第五章 版本與安裝"中,主程式都事先知道安裝的頭文件與鍊結庫的路徑,這明顯不太符合實際情況,因為大型的第三方庫,頭文件與庫文件都依照自己定義的路徑儲存。
因此,CMake提供了第三方庫與使用者之間的接口,第三方庫將庫文件與頭文件的路徑存放在Config檔中,而使用者透過 find_package() 指令找到第三方庫的Config檔後,就可以透過自動產生的變數使用第三方庫了。
find_package(),有兩種模式,一種是Module模式,另一種是Config模式,這兩種模式都會搜尋第三方庫的Config設定檔,透過這個檔案就可以定位到第三方庫的頭文件與鍊結庫的路徑。
find_package 預設使用Module模式。
在 Module 模式下,CMake 會在路徑中查找名為 Find.cmake 的檔案,會先在$ {CMAKE_MODULE_PATH} 變數對應的路徑中尋找,如果找不到,才會到$ {CMAKE_ROOT} 變數對應的路徑中尋找。
如果在 Module模式找不到,find_package 就會轉為 Config 模式。
在 Config 模式下,CMake 會在路徑中查找名為 Config.cmake或-config.cmake 的檔案。
Config模式的搜尋路徑有很多
$ abi-dumper <OLD.so> -o <ABI-0.dump> -lver 0
$ cd /bin
kai@esoc:/bin$ ./abi-dumper <OLD.so> -o <ABI-0.dump> -lver 0
kai@esoc:~$ echo $PATH
/home/kai/miniconda3/condabin:/home/kai/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/usr/local/cuda/bin
而第三方庫通常會將 xxx.cmake 安裝到此 PATH 路徑下。
在成功找到第三方庫之後,通常會定義以下變量,我們就可以依此來鍊結第三方庫。
${<NAME>_FOUND}
${<NAME>_INCLUDE_DIRS}, ${<NAME>_INCLUDES}
${<NAME>_LIBRARIES}, ${<NAME>_LIBRARIES_DIRS}, ${<NAME>_LIBS}
${<NAME>_DEFINITIONS}
find_package(<package_name1> [REQUIRED] [[COMPONENTS] name1 name2 ...]
<package_name2> [REQUIRED] [[COMPONENTS] name1 name2 ...]
...)
REQUIRED : 如果找不到該庫,就停止編譯並報錯
COMPONENTS : 該庫所依賴的其他組件